
GLOBAL  read_msw,_lidt
GLOBAL  int_08_hand, int_09_hand, int_IRQ3_hand, int_IRQ4_hand
GLOBAL	mascaraPIC1,mascaraPIC2,_Cli,_Sti
GLOBAL  debug
GLOBAL	cOut, cIn

EXTERN  int_08, int_09, int_70, int_IRQ4


SECTION .text


_Cli:
	cli			; limpia flag de interrupciones
	ret

_Sti:

	sti			; habilita interrupciones por flag
	ret

mascaraPIC1:			; Escribe mascara del PIC 1
		push    ebp
        mov     ebp, esp
        mov     ax, [ss:ebp+8]  ; ax = mascara de 16 bits
        out	21h,al
        pop     ebp
        retn

mascaraPIC2:			; Escribe mascara del PIC 2
	push    ebp
        mov     ebp, esp
        mov     ax, [ss:ebp+8]  ; ax = mascara de 16 bits
        out	0A1h,al
        pop     ebp
        retn

read_msw:
        smsw    ax		; Obtiene la Machine Status Word
        retn


_lidt:				; Carga el IDTR
        push    ebp
        mov     ebp, esp
        push    ebx
        mov     ebx, [ss: ebp + 6] ; ds:bx = puntero a IDTR 
	rol	ebx,16		    	
	lidt    [ds: ebx]          ; carga IDTR
        pop     ebx
        pop     ebp
        retn


int_08_hand:				; Handler de INT 8 ( Timer tick)
        push    ds
        push    es                      ; Se salvan los registros
        pusha                           ; Carga de DS y ES con el valor del selector
        mov     ax, 10h			; a utilizar.
        mov     ds, ax
        mov     es, ax
        call    int_08 
        mov	al,20h			; Envio de EOI generico al PIC
	out	20h,al
	popa                            
        pop     es
        pop     ds
        iret


; Debug para el BOCHS, detiene la ejecuci�n.
; Para continuar colocar en el BOCHSDBG: set $eax=0
;


debug:
        push    bp
        mov     bp, sp
        push	ax
vuelve:	mov     ax, 1
        cmp	ax, 0
	jne	vuelve
	pop	ax
	pop     bp
        retn
	

cOut:
        push   	ebp				;Se guarda el stackframe
        mov    	ebp, esp
        sub    	esp, 4
        mov    	eax, [ebp+8] 	;Se sacan los parametros
        mov    	edx, [ebp + 12] 
        mov    	[ebp - 2], ax 	
        mov    	[ebp-3], dl 
        mov    	al, [ebp-3] 
        mov    	dx, [ebp - 2] 
        out 	dx, al
        pop ebp
        retn

cIn:
        push    bp
        mov     bp, sp
        sub    	esp, 4
        mov    	eax, [ebp+8]
        mov	    [ebp-2], ax
        mov	    [ebp-3], byte 0
        mov    	dx, [ebp-2]
        in 		al, dx
        mov 	[ebp-3], al
        mov	    eax, 0
        mov     al, [ebp-3]
		pop ebp
        retn


int_09_hand:				; Handler de INT 9 (Teclado)
	push	ds
	push	es
	pusha
	mov	ax, 10h
	mov	ds, ax
	mov	es, ax
	in	al, 60h
	push	eax
	call	int_09
	mov	al, 20h
	out	20h, al
	pop	eax
	popa
	pop	es
	pop	ds
	iret


int_IRQ3_hand:				; Handler de INT 0Bh (COM2)
	push	ds
	push	es
	pusha
	
	mov 	eax, 00h
	mov 	dx, 02F8h
	in 	al, dx

	push 	eax
	call	int_IRQ4

	mov	al,20h			; Envio de EOI generico al PIC
	out	20h,al


	popa
	pop	es
	pop	ds
	iret

int_IRQ4_hand:				; Handler de INT 0Ch (COM1)
	push	dx
	pusha
	
	mov 	eax, 00h
	mov 	dx, 03F8h
	in 	al, dx

	push 	eax
	call	int_IRQ4

	mov	al,20h			; Envio de EOI generico al PIC
	out	20h,al

	pop 	eax
	popa
	pop 	dx
	iret

